using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
+using Microsoft.Xna.Framework.Audio;
namespace SuperPolarity
{
protected float MaxImmortalTime;
protected bool Flashing;
+ protected SoundEffect PolarityChange;
+ protected SoundEffect ShootSound;
+ protected SoundEffect Hit;
+
public MainShip(SuperPolarity newGame) : base(newGame) {}
~MainShip()
{
base.Initialize(texture, position);
- MainShip.BlueColor = new Color(230, 244, 249);
- MainShip.RedColor = new Color(255, 234, 241);
+ MainShip.BlueColor = new Color(0, 184, 229);
+ MainShip.RedColor = new Color(201, 0, 68);
+
+ PolarityChange = game.Content.Load<SoundEffect>("Sound\\polaritychange");
+ ShootSound = game.Content.Load<SoundEffect>("Sound\\bullet");
+ Hit = game.Content.Load<SoundEffect>("Sound\\hit");
InitParticleEngine();
SetPolarity(Polarity.Positive);
+ ActVelocity = 2.5f;
+
ShotCooldown = 50;
MaxImmortalTime = 1500;
protected void HandleShot(float value)
{
+
+ Shooting = true;
+ Timer t = new Timer(new TimerCallback(UnlockShot));
+ t.Change(ShotCooldown, Timeout.Infinite);
+
+ if (Children.Count > 10)
+ {
+ return;
+ }
+
var bullet = ActorFactory.CreateBullet(Position, Angle);
Children.Add(bullet);
bullet.Parent = this;
- Shooting = true;
- Timer t = new Timer(new TimerCallback(UnlockShot));
- t.Change(ShotCooldown, Timeout.Infinite);
+ ShootSound.Play();
}
protected void UnlockShot(object state)
{
InputController.Unlock("shoot");
+ Shooting = false;
}
protected void HandleChangePolarity(float value)
public void HandleHorizontalMovement(float value)
{
- Acceleration.X = value * AccelerationRate;
-
- if (value > 0.1 && Velocity.X < 0 || value < 0.1 && Velocity.X > 0)
+ if (value >= -0.5 && value <= 0.5)
{
- Acceleration.X *= 2;
+ value = 0;
}
- if (value > 0.1 && Velocity.Y < 0 || value < 0.1 && Velocity.Y > 0)
- {
- Acceleration.Y *= 2;
- }
+ Velocity.X = value * MaxVelocity;
}
public void HandleVerticalMovement(float value)
{
- Acceleration.Y = value * AccelerationRate;
+ if (value >= -0.5 && value <= 0.5)
+ {
+ value = 0;
+ }
+
+ Velocity.Y = value * MaxVelocity;
}
public override void SwitchPolarity()
{
base.SwitchPolarity();
SwitchParticleEngine(CurrentPolarity);
+ PolarityChange.Play();
game.Player.ResetMultiplier();
}
particleEngine.Update();
ConstrainToEdges();
UpdateImmortality(gameTime);
- Shooting = false;
}
public void UpdateImmortality(GameTime gameTime)
public override void Move(GameTime gameTime)
{
- base.Move(gameTime);
+ var VelocityLimit = MaxVelocity;
+ var SavedVelocity = new Vector2(Velocity.X, Velocity.Y);
if (Shooting)
{
- if (Velocity.X > ActVelocity)
- {
- Velocity.X = ActVelocity;
- }
+ VelocityLimit = ActVelocity;
+ }
- if (Velocity.X < -ActVelocity)
- {
- Velocity.X = -ActVelocity;
- }
+ if (SavedVelocity.X > VelocityLimit)
+ {
+ SavedVelocity.X = VelocityLimit;
+ }
- if (Velocity.Y > ActVelocity)
- {
- Velocity.Y = ActVelocity;
- }
+ if (SavedVelocity.X < -VelocityLimit)
+ {
+ SavedVelocity.X = -VelocityLimit;
+ }
- if (Velocity.Y < -ActVelocity)
- {
- Velocity.Y = -ActVelocity;
- }
+ if (SavedVelocity.Y > VelocityLimit)
+ {
+ SavedVelocity.Y = VelocityLimit;
+ }
+
+ if (SavedVelocity.Y < -VelocityLimit)
+ {
+ SavedVelocity.Y = -VelocityLimit;
}
+
+ Position.X = Position.X + SavedVelocity.X;
+ Position.Y = Position.Y + SavedVelocity.Y;
}
public override void Magnetize(Ship ship, float distance, float angle)
if (game.Player.Lives < 0)
{
Dying = true;
+ game.GameOver();
}
else {
+ Hit.Play();
Immortal = true;
CurrentImmortalTime = 0;
}
}
+
+ public override void CleanUp()
+ {
+ base.CleanUp();
+ particleEngine = null;
+ InputController.Unbind("moveX", HandleHorizontalMovement);
+ InputController.Unbind("moveY", HandleVerticalMovement);
+ InputController.Unbind("changePolarity", HandleChangePolarity);
+ InputController.Unbind("shoot", HandleShot);
+ }
}
}